package com.eb.service;

import com.eb.client.UserClient;
import com.eb.dao.AlsoDao;
import com.eb.dao.KjDao;
import com.eb.mapper.AlsoMapper;
import com.eb.mapper.AlsodetailedMapper;
import com.eb.mapper.BargainGoodsMapper;
import com.eb.pojo.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import util.BargainCommonUtils;

import java.math.BigDecimal;
import java.util.*;

@Service
public class  KjService {

    @Autowired
    private KjDao kjDao;
    @Autowired
    private BargainGoodsMapper bargainGoodsMapper;
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private UserClient userClient;
    @Autowired
    private AlsodetailedMapper alsodetailedMapper;
    @Autowired
    private AlsoMapper alsoMapper;
    @Autowired
    private AlsoDao alsoDao;

    public List<BargainGoods> list() {
        return kjDao.findAll();
    }

    public List<Map<String,Object>> shop() {
        return kjDao.shop();
    }

    public Map<String, Object> findById(int id) {
        return kjDao.findById1(id);
    }
    public List<BigDecimal> kanjia(long id) {
        //首先通过id 获取到砍价商品的信息
        BargainGoods goods = bargainGoodsMapper.selectByPrimaryKey(id);
        //定义一个count 通过得到的实体类 goods.getKnife 表示的是砍几刀 赋值给 count
        int count = goods.getKnife();
        //通过调用砍价算法的工具类 传一个 count(表示砍几刀到低价) 一个goods.getGoodPrice() 表示的是 商品的价格
        //goods.getGoodUpset()表示的是商品的低价  就会生成一个 砍价的集合。
        List<BigDecimal> list = BargainCommonUtils.getTempBargainList(count, goods.getGoodPrice(), goods.getGoodUpset());
        //获取当前用户的信息。
        MiaoshaUser user = userClient.user();
        //将我们获取的砍价集合存放到 redis的list中 ,为了避免key的值被重复，我们的key定义为 kj+当前用户的id;
        redisTemplate.opsForList().leftPushAll("kj"+user.getId(),list);
        //返回集合
        return list;
    }

    public Result kjGoods(Also also) {

        //获取当前登录人的登录信息
        MiaoshaUser user = userClient.user();

        also.setUserid(user.getId());
        //通过传一个当前用户人的id和一个商品  判断他们是否是重复了此商品的砍价操作。
        int tjgoodscount= alsoMapper.findCount(also.getUserid(),also.getGoodsname());
        //如果是的话，直接返回一个砍价失败。
        if (1<=tjgoodscount){
            return new Result(false,"砍价失败,您已经发起过砍价了");
        }
        //如果没有 我们就通过redis的list类型 得到一个砍价的数目
        Object pop = redisTemplate.opsForList().leftPop("kj" + also.getUserid());
        //also的price字段代表的是总价 -砍价的数目。
        also.setPrice(also.getPrice().subtract((BigDecimal) pop));
        //添加到表里边
        alsoMapper.insert(also);
        //创建一个砍价详细表的对象
        Alsodetailed alsodetailed = new Alsodetailed();
        //由于我们发起砍价，所以第一次是自己给自己砍
        //userid 代表的是砍价的发起人的id  helpid是帮助你砍价的人的id.
        alsodetailed.setUserid(also.getUserid());
        alsodetailed.setBid(also.getBid());
        //goodsname代表的是商品名称
        alsodetailed.setGoodsname(also.getGoodsname());
        alsodetailed.setHelpid(user.getId());
        //alsoprice代表的是砍了多少钱
        alsodetailed.setAlsoprice((BigDecimal) pop);
        //最后添加到砍价详细表中
        alsodetailedMapper.insert(alsodetailed);
        return new Result(true,"恭喜您砍价成功,您已经砍价"+pop+"元");


    }

    public void redisget() {
        MiaoshaUser user = userClient.user();
        Object aa = redisTemplate.opsForList().leftPop("kj"+user.getId());
        System.out.println(aa);
    }

    public void redislist() {
        MiaoshaUser user = userClient.user();
        List range = redisTemplate.opsForList().range("kj" + user.getId(), 0, 12);
        System.out.println(range);
    }

    public List<Also> alsoList() {

         return alsoMapper.selectByExample(null);
    }

    public Object kanyidao(Long id) {
        //获取当前用户信息
        MiaoshaUser user = userClient.user();
        Also also = alsoDao.findById(id).get();
        //通过id查询到 Also 的砍价发起人的信息。
        Object aa = redisTemplate.opsForList().leftPop("kj"+also.getUserid());
        //通过redis 获取到砍价的砍价数。
        also.setPrice(also.getPrice().subtract((BigDecimal) aa));
        //计算还剩下多少钱。
        alsoMapper.updateByPrimaryKey(also);
        //修改also表
        Alsodetailed alsodetailed = new Alsodetailed();
        //创建砍价信息表
        alsodetailed.setAlsoprice((BigDecimal) aa);
        //给砍了多少钱的字段赋值。
        alsodetailed.setGoodsname(also.getGoodsname());
        //商品名称赋值
        alsodetailed.setBid(also.getBid());
        //给砍价商品的id赋值
        alsodetailed.setHelpid(user.getId());
        //通过当前用户人 给帮砍价人的字段赋值
        alsodetailed.setUserid(also.getUserid());
        //给发起者赋值。
        alsodetailedMapper.insert(alsodetailed);
        //添加
        //返回砍了多少钱。
        return aa;
    }
}
